package com.by.rpc.util;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;

/**

 Lua 脚本执行工具类（支持多序列化方式的 RedisTemplate）
 @author lby
 @date 2025/8/2 17:45
 */
@Component
@ConditionalOnBean(RedisTemplate.class)
public class RedisLuaHelper {
    // 原有对象序列化的 RedisTemplate
    private final RedisTemplate<String, Object> objectRedisTemplate;
    // 新增字符串序列化的 RedisTemplate（用于库存等场景）
    private final RedisTemplate<String, String> stringRedisTemplate;
    // 构造方法注入两种 RedisTemplate
    public RedisLuaHelper (RedisTemplate<String, Object> objectRedisTemplate,
                           RedisTemplate<String, String> stringRedisTemplate) {
        this.objectRedisTemplate = objectRedisTemplate;
        this.stringRedisTemplate = stringRedisTemplate;
    }
    /**
     使用对象序列化的 RedisTemplate 执行 Lua 脚本（支持多个 key）
     */
    public <T> T executeObjectLua(DefaultRedisScript<T> script, List<String> keys, String... args) {
        return objectRedisTemplate.execute(script, keys, (Object[]) args);
    }
    /**
     使用对象序列化的 RedisTemplate 执行 Lua 脚本（单个 key 快捷方法）
     */
    public <T> T executeObjectLua(DefaultRedisScript<T> script, String key, String... args) {
        return executeObjectLua(script, Collections.singletonList(key), args);
    }
    /**
     使用字符串序列化的 RedisTemplate 执行 Lua 脚本（支持多个 key）
     */
    public <T> T executeStringLua(DefaultRedisScript<T> script, List<String> keys, String... args) {
        return stringRedisTemplate.execute(script, keys, (Object[]) args);
    }
    /**
     使用字符串序列化的 RedisTemplate 执行 Lua 脚本（单个 key 快捷方法）
     */
    public <T> T executeStringLua(DefaultRedisScript<T> script, String key, String... args) {
        return executeStringLua(script, Collections.singletonList(key), args);
    }
}